/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication6;

import java.util.LinkedList;
import java.util.Queue;
import java.util.logging.Logger;


public class GestorMemoriaIntermedia {
    static final Logger logger = Logger.getLogger("Gestion de Buffer");
    private Pagina[] buffer;
    private int numeroPaginas;
    private int posicionUltimaPagina = -1;
    private Queue colaLRU;
    public GestorMemoriaIntermedia(int numeroPaginas) {
        this.numeroPaginas = numeroPaginas;
        buffer = new Pagina[numeroPaginas];
        colaLRU = new LinkedList<Integer>();
    }
    public Pagina recuperarPaginaDelBuffer(int numeroPagina) {
        int posicion = posicionDePaginaEnBuffer(numeroPagina);
        if (posicion >= 0) // la pagina esta en el buffer
            { 
            // Marcar Pagina o bloque como recientemente referenciado 
            colaLRU.remove(numeroPagina); colaLRU.add(numeroPagina); 
            // devolver la pagina del buffer al solicitante
            return buffer[posicion];
        }
        return null;
    }
    public Pagina ponerPaginaEnBuffer(Pagina pagina) {
        if (estaPaginaEnBuffer(pagina)) {
            return null;
        }
        else if (!bufferLLeno()) {
            
            posicionUltimaPagina++; 
            buffer[posicionUltimaPagina] = pagina;
            colaLRU.remove(posicionUltimaPagina); 
            colaLRU.add(posicionUltimaPagina);
            return null;
            
        }
        else {
            int numeroPaginaDescartada = (Integer) colaLRU.remove(); 
            int posicion = posicionDePaginaEnBuffer(numeroPaginaDescartada);
            Pagina paginaDescartada = buffer[posicion];
            buffer[posicion] = pagina;
            colaLRU.add(pagina.getNumeroPagina()); 
            return paginaDescartada;
        }
    }
    
    private int posicionDePaginaEnBuffer(int numeroPagina) {
        int posicion = -1; 
        for (int i = 0; i < buffer.length; i++) {
            if ((buffer[i] != null) && (numeroPagina == buffer[i].getNumeroPagina())) {
                        posicion = i; 
        break;
            }
        }
    return posicion;
    }
    private boolean estaPaginaEnBuffer(Pagina pagina)
    { return (posicionDePaginaEnBuffer(pagina.getNumeroPagina()) != -1);
    
    }
    private boolean bufferLLeno() {
        return numeroPaginas - 1 == posicionUltimaPagina;
    }
    @Override public String toString() {
        String resultado = ""; 
        for (int i = 0; i < buffer.length; i++) 
        { resultado += "Bloque[" + i + "]: " + buffer[i] + "\n";
        
        }
        return resultado + "\n" + this.colaLRU;
    }
    
}
